import router from "./router";
import type { RouteRecordRaw } from "vue-router";
import { isRelogin } from "@/config/axios/service";
import { getAccessToken } from "@/utils/auth";
import { useTitle } from "@/hooks/web/useTitle";
import { useNProgress } from "@/hooks/web/useNProgress";
import { usePageLoading } from "@/hooks/web/usePageLoading";
import { useDictStoreWithOut } from "@/store/modules/dict";
import { useUserStoreWithOut } from "@/store/modules/user";
import { usePermissionStoreWithOut } from "@/store/modules/permission";

const { start, done } = useNProgress();

const { loadStart, loadDone } = usePageLoading();
// 路由不重定向白名单
const whiteList = [
  "/login",
  "/social-login",
  "/auth-redirect",
  "/bind",
  "/register",
  "/oauthLogin/gitee",
];
const remPaths = ["/yxt/school/data","/yxt/course/data", "/yxt/room/data", "/dashboard/platform", "/dashboard/data"];

// 路由加载前
router.beforeEach(async (to, from, next) => {
  start();
  loadStart();
  // 处理fontsize
  if (!remPaths.includes(to.fullPath)) {
    const html = document.querySelector("html");
    if (html) html.style.fontSize = "";
  } else {
    const screenHeight = window.innerHeight;
    let topeElHeight = 85;
    const topElement = document.getElementById("topppp");
    if (topElement) topeElHeight = topElement.clientHeight;
    const html = document.querySelector("html");
    const danwei = (screenHeight - topeElHeight) / 1010;
    if (html) html.style.fontSize = danwei + "px";
  }
  if (getAccessToken()) {
    if (to.path === "/login") {
      next({ path: "/" });
    } else {
      // 获取所有字典
      const dictStore = useDictStoreWithOut();
      const userStore = useUserStoreWithOut();
      const permissionStore = usePermissionStoreWithOut();
      if (!dictStore.getIsSetDict) {
        await dictStore.setDictMap();
      }
      if (!userStore.getIsSetUser) {
        isRelogin.show = true;
        await userStore.setUserInfoAction();
        isRelogin.show = false;
        // 后端过滤菜单
        await permissionStore.generateRoutes();
        permissionStore.getAddRouters.forEach((route) => {
          router.addRoute(route as unknown as RouteRecordRaw); // 动态添加可访问路由表
        });
        const redirectPath = from.query.redirect || to.path;
        const redirect = decodeURIComponent(redirectPath as string);
        const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
        next(nextData);
      } else {
        next();
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next();
    } else {
      next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
    }
  }
});

router.afterEach((to) => {
  useTitle(to?.meta?.title as string);
  done(); // 结束Progress
  loadDone();
});
